%%% programa para procesar los datos de consumo diario
%%%OJO este programa trabaja con la variable porcentual respecto a la media
%%%o mediana hist?rica y no respecto al consumo anterior!!!!!!!
%%%ADICONALMENTE ESTE PROGRAMA NO UTILIZA LOS CEROS PARA CALCULAR LAS
%%%MEDIAS O MEDIANAS RESPECTIVAS
clear all
tic
load codensa.mat%% contiene los datos en clientes1_650188 como una matriz de 2047000x39, donde del
%%%campo 4 al 38 se encuentran los datos de interes. la columna 39 es el
%%%tipo donde 1 es residencial, 2 es comercial, 3 es industrial y 4 es
%%%oficial

load datossim.mat


% datacons=codensa(:,4:38);%%datos de consumo
% 
% %%%%DATACONS PRUEBA
% %datacons=datacons(1:500000,:);
% 
% %%%Borrar Nans de datacons
% for i=1:size(datacons,2)
%     clear temp
%     temp=isfinite(datacons(:,i));
% datacons=datacons(temp,:);
% end
% 
% 
% 
%  
%  %%% Calculo de diferencias porcentuales
%  deltarel=100*diff(datacons,1,2)./datacons(:,1:size(datacons,2)-1);
%  
%  %%%VOLVER LOS ZEROS EN DATACONS COMO NANS
%  datacons(find(datacons==0))=NaN;
%  
%  %%%% Calculo de diferencias porcentuales respecto a la media
%   %%% Matriz de medias SIN CEROS
%   medias=zeros(size(datacons,1),size(datacons,2)-1);
%   for i=1:size(datacons,2)-1
%       medias(:,i)=nanmean(datacons(:,1:i+1),2);%%%Calculo de media de valores que llevan
%       %%% en el momento de mirar el delta!!
%       i
%   end
%  deltarel_media=100*diff(datacons,1,2)./medias;
%  
%  
%  %%%% Calculo de diferencias porcentuales respecto a la media
%   %%% Matriz de medianas
%   medianas=zeros(size(datacons,1),size(datacons,2)-1);
%   for i=1:size(datacons,2)-1
%       medianas(:,i)=nanmedian(datacons(:,1:i+1),2);%%%Calculo de media de valores que llevan
%       %%% en el momento de mirar el delta!!
%       i
%   end
%  deltarel_mediana=100*diff(datacons,1,2)./medianas;
%  
%  warning('Listo las variaciones relativas!!!!')
%  toc
%  
%  %%LIMPIEZA DE INF EN DELTAREL, DELTAREL_MEDIA Y DELTAREL_MEDIANA
%  %% PUEDEN SER INFINITO Por 2 consumos consecutivos iguales a 0 lo que da
%  %% una mediana de cero y un deltarel_mediana Inf o un deltarel media NaN
% 
%  
%  %%%% Hay que tener cuidado con los datos de consumo Inf en deltarel ya que
%  %%%% se producen cuando en un periodo hay consumo 0. Para evitar este
%  %%%% problema se convierten todos los inf de deltarel en NaN para que as?
%  %%%% la funci?n percentil no los tome en cuenta, igualmente
%  %%%% deltarel_mediana puede ser -Inf!!! OJO!!!
%  
%  deltarel(find(deltarel==Inf))=NaN;
%  deltarel_media(find(deltarel_media==Inf))=NaN;
%  deltarel_mediana(find(deltarel_mediana==Inf))=NaN;
%  deltarel(find(deltarel==-Inf))=NaN;
%  deltarel_media(find(deltarel_media==-Inf))=NaN;
%  deltarel_mediana(find(deltarel_mediana==-Inf))=NaN;
%  
%  
% 
%  

 
%%%%CALCULOS DE ZSCORES 99 SOBRE CONSUMOS%%%%%%%%%%%%%%%%%

%%%%%LIMITES ZSCORE UMBRALES

zsup=6.5;%%%Limite en desv estandar por encima de la media
zinf=-3.5;%%%L?mite en desv estandar por debajo de la media

 %Prueba utilizando ZSCORES para detecci?n de anomal?as
 %Esta prueba se realizar? utilizando los valores de los ultimos ke meses
 %para verificar la efectividad del metodo
 %deltarel tiene longitud de 34 campos
 tic
 ke=12;%%% periodo de evaluaci?n ultimos ke meses
 %Matriz de sospechosos presumiendo inocencia con valores 0
 zmodscores=zeros(length(datacons),ke);%%%
 %%%LIMPIEZA DE DATACONS PARA HACER CEROS NAN
 dataconsmedias=datacons;
 dataconsmedias(find(dataconsmedias==0))=NaN;
 
 %%% CALCULO DE ZSCORES MOD%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 %%% Calculo sin ventana
 for i=1:ke
     %%Calculo de zscores
     kep=size(datacons,2)-ke-1+i;
     %%%% Calculo de zscores
     
     mediazscore=nanmedian(dataconsmedias(:,1:kep),2);%%%MEDIA OBVIANDO NaNs de cada cliente
     desvestzscores=mad(dataconsmedias(:,1:kep),1,2);%%Desviaci?n obviando nans de cada cliente
     zscorestemp=0.6745*(datacons(:,kep+1)-mediazscore)./desvestzscores;%%%Normalizaci?n de cada medida nueva
     
%%Comparar a los nuevos valores zscores con los limites inferiores z1 y z2
%%% Hacer cero los que NO son sospechosos
zscorestemp(find(zscorestemp>zinf & zscorestemp<zsup))=0;
zmodscores(:,i)=zscorestemp;

%complimite5=deltarel_media(:,kep+1)-VARi(:,1);%%comparacion con VAR5%
%complimite95=deltarel_media(:,kep+1)-VARi(:,2);%%comparacion con VAR5%

     i
 end
 %%Organizar clientes y sospechosos, donde esta el ZSCORE de solamente los
 %%clientes sospechosos
 criticavar=[codensa(:,[1 2 39]) zmodscores];  %%%%TABLA
 toc
 %%%%ORDENAMIENTO DE LOS CLIENTES SOSPECHOSOS POR ZSCORE!!!!!
 criticavarord=sortrows(criticavar,-size(criticavar,2));
 
%%%%%Calculo de zscores con ventanas%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%Ventana de 12 meses
vent=12;
zmodscores12=zeros(length(datacons),ke);%%%
 

 for i=1:ke
     %%Calculo de zscores
     kep=size(datacons,2)-ke-1+i;
     
     mediazscore=nanmedian(dataconsmedias(:,kep-vent+1:kep),2);%%%MEDIA OBVIANDO NaNs de cada cliente
     desvestzscores=mad(dataconsmedias(:,kep-vent+1:kep),1,2);%%Desviaci?n obviando nans de cada cliente
     zscorestemp=0.6745*(datacons(:,kep+1)-mediazscore)./desvestzscores;%%%Normalizaci?n de cada medida nueva
    
     
    %%Comparar a los nuevos valores zscores con los limites inferiores z1 y z2
%%% Hacer cero los que NO son sospechosos
zscorestemp(zscorestemp>zinf & zscorestemp<zsup)=0;
 zmodscores12(:,i)=zscorestemp;
     i
 end
 %%Organizar clientes y sospechosos
 criticavar12=[codensa(:,[1 2 39]) zmodscores12];  
 toc
 
  %%%%ORDENAMIENTO DE LOS CLIENTES SOSPECHOSOS POR ZSCORE!!!!!
 criticavar12ord=sortrows(criticavar12,-size(criticavar12,2));
 
 

%%Ventana de 18 meses%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vent=18;
zmodscores18=zeros(length(datacons),ke);%%%
 

 for i=1:ke
     %%Calculo de zscores
     kep=size(datacons,2)-ke-1+i;
     
     mediazscore=nanmedian(dataconsmedias(:,kep-vent+1:kep),2);%%%MEDIA OBVIANDO NaNs de cada cliente
     desvestzscores=mad(dataconsmedias(:,kep-vent+1:kep),1,2);%%Desviaci?n obviando nans de cada cliente
     zscorestemp=0.6745*(datacons(:,kep+1)-mediazscore)./desvestzscores;%%%Normalizaci?n de cada medida nueva
    
     
    %%Comparar a los nuevos valores zscores con los limites inferiores z1 y z2
%%% Hacer cero los que NO son sospechosos
zscorestemp(zscorestemp>zinf & zscorestemp<zsup)=0;
 zmodscores18(:,i)=zscorestemp;
     i
 end
 %%Organizar clientes y sospechosos
 criticavar18=[codensa(:,[1 2 39]) zmodscores18];  
 toc
 
  %%%%ORDENAMIENTO DE LOS CLIENTES SOSPECHOSOS POR ZSCORE!!!!!
 criticavar18ord=sortrows(criticavar18,-size(criticavar18,2));
 
 
 %%Calculo de zscores con ventanas
%%Ventana de 6 meses
vent=6;
zmodscores6=zeros(length(datacons),ke);%%%
 

 for i=1:ke
     %%Calculo de zscores
     kep=size(datacons,2)-ke-1+i;
     
     mediazscore=nanmedian(dataconsmedias(:,kep-vent+1:kep),2);%%%MEDIA OBVIANDO NaNs de cada cliente
     desvestzscores=mad(dataconsmedias(:,kep-vent+1:kep),1,2);%%Desviaci?n obviando nans de cada cliente
     zscorestemp=0.6745*(datacons(:,kep+1)-mediazscore)./desvestzscores;%%%Normalizaci?n de cada medida nueva
    
     
    %%Comparar a los nuevos valores zscores con los limites inferiores z1 y z2
%%% Hacer cero los que NO son sospechosos
zscorestemp(zscorestemp>zinf & zscorestemp<zsup)=0;
 zmodscores6(:,i)=zscorestemp;
     i
 end
 %%Organizar clientes y sospechosos
 criticavar6=[codensa(:,[1 2 39]) zmodscores6];  
 toc
 
  %%%%ORDENAMIENTO DE LOS CLIENTES SOSPECHOSOS POR ZSCORE!!!!!
 criticavar6ord=sortrows(criticavar6,-size(criticavar6,2));
 
 

 save zmodscorecodensaventanasconsumoexcludceros65 criticavar criticavarord criticavar6 criticavar6ord criticavar12 criticavar12ord criticavar18 criticavar18ord 